//
//  shui_xian_hua.c
//  project-c
//
//  Created by 小演员的MacBook on 2023/10/15.
//

#include "shui_xian_hua.h"

/*
 输出指定范围内的水仙花数
 在某个范围内循环所有的数字
 每个数字除以10，如果商为0就结束了；否则用商作为被除数，继续除以10；过程中的余数就是各个位上的值，它们的三次方的和等于原数字的，就是水仙花数；
 */
void shui_xian_hua(int start_num, int end_num) {
    //计算出最大位数
    int bit_count = count_bits(end_num);
    //声明数组
    int bit[bit_count];
    //统计水仙花数量
    int count = 0;
    //主逻辑，寻找水仙花，并打印出来
    for (int num = start_num; num <= end_num; num++) {
        //初始化数组
        init_array(bit, bit_count);
        //获取每个数字，用于后续的计算
        int temp_num = num;
        //记录各个位的值
        for (int i = 0; i < end_num; i++) {
            //商为0就停止
            if (temp_num == 0) {
                break;
            }
            //除以10求余数
            bit[i] = temp_num % 10;
            //除以10求商
            temp_num = temp_num / 10;
        }
        //保存各个位的立方和
        int sum = 0;
        //计算各个位的立方和
        for (int i = 0; i < bit_count; i++) {
            sum += bit[i] * bit[i] * bit[i];
        }
        //各个位的立方和 等于 当前数字，那就是 水仙花数
        if (sum == num) {
            printf("第%d个水仙花数：%d\n", ++count, num);
        }
    }
}
/*
 初始化数组
 */
void init_array(int *bit, int bit_count) {
    for (int i = 0; i < bit_count; i++) {
        bit[i] = 0;
    }
}

/*
 计算出最大位数
 */
int count_bits(int end_num) {
    //保存最大位数
    int bit_count = 0;
    //保存当前计算最大位数的过程变量
    int end_num_temp = end_num;
    //计算出最大的位数
    while (1) {
        bit_count++;
        if ((end_num_temp = end_num_temp / 10) == 0) {
            return bit_count;
        }
    }
}
